package bean;

import java.io.Serializable;
import java.sql.Time;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Date;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.*;
import javax.faces.context.FacesContext;

import controller.AmministrazioneInterface;
import controller.RicercaInterface;
import controller.UserMgr;
import dto.ElementoBaseDTO;
import dto.PacchettoPredefinitoDTO;
import dto.UtenteDTO;
import dto.VoloDTO;

@ManagedBean(name="pacchettoPredBean")
@ViewScoped
public class PacchettoPredBean implements Serializable {
	
	@EJB
	private UserMgr userMgr;
	@EJB
	private AmministrazioneInterface admin;
	@EJB
	private RicercaInterface ricerca;
	
	private PacchettoPredefinitoDTO pacchetto;
	private PacchettoPredefinitoDTO selectedPacchetto;
	private ElementoBaseDTO elemento;
	private ElementoBaseDTO selectedElemento;
	
	public PacchettoPredBean(){
		this.pacchetto = new PacchettoPredefinitoDTO();
	}

	public PacchettoPredefinitoDTO getPacchetto() {
		return pacchetto;
	}

	public void setPacchetto(PacchettoPredefinitoDTO pacchetto) {
		this.pacchetto = pacchetto;
	}

	public ElementoBaseDTO getElemento() {
		return elemento;
	}
	
	public void setElemento(ElementoBaseDTO elemento) {
		this.elemento = elemento;
	}

	public ElementoBaseDTO getSelectedElemento() {
		return selectedElemento;
	}

	public void setSelectedElemento(ElementoBaseDTO selectedElemento) {
		this.selectedElemento = selectedElemento;
	}
	
	public String crea(){
		UtenteDTO usr = userMgr.getUtenteDTO();
		List<PacchettoPredefinitoDTO> list = usr.getPacchettiPredefiniti();
		pacchetto.setData(new Date());
		list.add(pacchetto);
		usr.setPacchettiPredefiniti(list);
		this.userMgr.update(usr);	
		return "index?faces-redirect=true";
	}
	
	public String elimina(){
		
		UtenteDTO usr = userMgr.getUtenteDTO();
		List<PacchettoPredefinitoDTO> list = usr.getPacchettiPredefiniti();
		List<PacchettoPredefinitoDTO> newList = new ArrayList<PacchettoPredefinitoDTO>();
		
		for(PacchettoPredefinitoDTO dto : list){
			System.out.println("Id: "+dto.getIdPacchettoPredefinito()+"\n");
			if(dto.getIdPacchettoPredefinito()!= selectedPacchetto.getIdPacchettoPredefinito())
				newList.add(dto);

		}
		usr.setPacchettiPredefiniti(newList);
		this.userMgr.update(usr);	
		admin.eliminaPacchetto(selectedPacchetto);
		return "index?faces-redirect=true";
		
	}

	public PacchettoPredefinitoDTO getSelectedPacchetto() {
		return selectedPacchetto;
	}

	public void setSelectedPacchetto(PacchettoPredefinitoDTO selectedPacchetto) {
		this.selectedPacchetto = selectedPacchetto;
	}
	
	public void aggiungiElemento(ElementoBaseDTO selectedElemento){
		if(selectedElemento!=null){
		List<ElementoBaseDTO> newList = this.selectedPacchetto.getElementi();
		newList.add(selectedElemento);
		this.selectedPacchetto.setElementi(newList);
		this.selectedPacchetto.setApprovato(false);
		this.selectedPacchetto.setTotale(this.selectedPacchetto.getTotale()+selectedElemento.getPrezzo());
		admin.modificaPacchetto(selectedPacchetto);
		}
	}
	
	public void eliminaElemento(){
		if(this.selectedElemento!=null){
		List<ElementoBaseDTO> newList = new ArrayList<ElementoBaseDTO>();
		for(ElementoBaseDTO e : this.selectedPacchetto.getElementi()){
			if(e.getIdElementoBase()!=this.selectedElemento.getIdElementoBase()){
				newList.add(e);
			}
		}
		this.selectedPacchetto.setElementi(newList);
		this.selectedPacchetto.setApprovato(false);
		this.selectedPacchetto.setTotale(this.selectedPacchetto.getTotale()-selectedElemento.getPrezzo());
			admin.modificaPacchetto(selectedPacchetto);
		}
		}
	
	public void caricaDettaglio(String id){
		try{
		int pk = Integer.parseInt(id);
		this.selectedPacchetto = admin.getPacchettoPredefinitoPK(pk);
		}catch(Exception e){}

	}
	
	public String dettaglioPacchetto(){
		return "dettaglioPacchetto.xhtml?faces-redirect=true&amp;id="+this.selectedPacchetto.getIdPacchettoPredefinito();
	}
	
	public String dettaglioPacchetto(PacchettoPredefinitoDTO selectedPacchetto){
		return "dettaglioPacchettoPred.xhtml?faces-redirect=true&amp;id="+selectedPacchetto.getIdPacchettoPredefinito();
	}
	
	public void valida(){
		boolean ok = true;
		if(this.selectedPacchetto.getElementi().size()<2){
        FacesContext facesContext = FacesContext.getCurrentInstance();  
        facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Validazione del pacchetto fallita","Il pacchetto contiene meno di due elementi!" ));
		ok = false;
        return;
		}
		
		List<VoloDTO> voli = new ArrayList<VoloDTO>();
		List<ElementoBaseDTO> elementi = new ArrayList<ElementoBaseDTO>();
		
		List<ElementoBaseDTO> voliE =new ArrayList<ElementoBaseDTO>();
		for(ElementoBaseDTO e : selectedPacchetto.getElementi()){
			if(e.getTipo().equals("Volo"))
				voliE.add(e);
			elementi.add(e);
		}
		if(voliE.size()==0){
	        FacesContext facesContext = FacesContext.getCurrentInstance();  
	        facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Validazione del pacchetto fallita","Il pacchetto non contiene voli" ));
			return ;
		}
		Collections.sort(voliE, new Comparator<ElementoBaseDTO>() {
			   public int compare(ElementoBaseDTO o1, ElementoBaseDTO o2) {
				      Date a = o1.getData();
				      Date b = o2.getData();
				      if(a.compareTo(b)==0){
				    	  String t1 = o1.getOra()+":00";
				    	  String t2 = o2.getOra()+":00";
				    	  Time time1 = Time.valueOf(t1);
				    	  Time time2 = Time.valueOf(t2);
				    	  return time1.compareTo(time2);
				   }
				      else return a.compareTo(b);
			   }
			});

		Collections.sort(elementi, new Comparator<ElementoBaseDTO>() {
			   public int compare(ElementoBaseDTO o1, ElementoBaseDTO o2) {
				      Date a = o1.getData();
				      Date b = o2.getData();
				      if(a.compareTo(b)==0){
				    	  String t1 = o1.getOra()+":00";
				    	  String t2 = o2.getOra()+":00";
				    	  Time time1 = Time.valueOf(t1);
				    	  Time time2 = Time.valueOf(t2);
				    	  return time1.compareTo(time2);
				   }
				      else return a.compareTo(b);
			   }
			});
		
		System.out.println("In ordine");
		for(ElementoBaseDTO e : elementi){
			System.out.println("Elemento :"+e.getNome()+" in data "+ e.getData()+" e in ora "+e.getOra());
		}

		for(ElementoBaseDTO e : voliE){
			voli.add(ricerca.getDettaglioVolo(e));
		}
		

		for(int i=0;i<voli.size()-1;i++){
				if(!voli.get(i).getCittàArrivo().equalsIgnoreCase(voli.get(i+1).getCittàPartenza())){
					ok = false;
				
				}
				System.out.println("i: "+voli.get(i).getCittàArrivo());
				System.out.println("i+1: "+voli.get(i+1).getCittàPartenza());	
		}
		if(!ok){
		       FacesContext facesContext = FacesContext.getCurrentInstance();  
		       facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Validazione del pacchetto fallita","Città di partenza e arrivo non sono uguali!" ));
		       return;
		}
		if(!voli.get(0).getCittàPartenza().equalsIgnoreCase(voli.get(voli.size()-1).getCittàArrivo())){
				ok=false;
			    FacesContext facesContext = FacesContext.getCurrentInstance();  
			    facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Validazione del pacchetto fallita","I voli di andate e ritorno non coincidono!" ));
			       
		}
		
		if(!elementi.get(0).getTipo().equals("Volo")){
			ok = false;
			FacesContext facesContext = FacesContext.getCurrentInstance();  
		    facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Validazione del pacchetto fallita","Non possono esserci elementi in date precedenti al volo di partenza!" ));
		}
	      
		if(!elementi.get(elementi.size()-1).getTipo().equals("Volo")){
			ok = false;
			FacesContext facesContext = FacesContext.getCurrentInstance();  
		    facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Validazione del pacchetto fallita","Non possono esserci elementi in date successive al volo di ritorno!" ));
		}
		
		for(int i=0;i<elementi.size()-1;i++){
				ElementoBaseDTO e1 = elementi.get(i);
				ElementoBaseDTO e2 = elementi.get(i+1);
				String c1 = "";
				String c2 = "";
				if(e1.getTipo().equals("Volo"))
					c1=ricerca.getDettaglioVolo(e1).getCittàArrivo();
				else if(e1.getTipo().equals("Escursione"))
					c1=ricerca.getDettaglioEscursione(e1).getCittà();
				else if(e1.getTipo().equals("Hotel"))
					c1=ricerca.getDettaglioHotel(e1).getCittà();
				
				if(e2.getTipo().equals("Volo"))
					c2=ricerca.getDettaglioVolo(e2).getCittàPartenza();
				else if(e2.getTipo().equals("Escursione"))
					c2=ricerca.getDettaglioEscursione(e2).getCittà();
				else if(e2.getTipo().equals("Hotel"))
					c2=ricerca.getDettaglioHotel(e2).getCittà();	
				if(!c1.equalsIgnoreCase(c2)){
					FacesContext facesContext = FacesContext.getCurrentInstance();  
				    facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Validazione del pacchetto fallita", "La città dell'elemento "+e1.getNome()+" e "+e2.getNome()+" non sono consistenti." ));
					ok=false;
				}
				System.out.println("Elemento "+e1.getNome()+" città "+c1);
				System.out.println("Elemento "+e2.getNome()+" città "+c2);

		}
		
		if(ok){
			FacesContext facesContext = FacesContext.getCurrentInstance();  
		    facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Validazione effettuata con successo! ", "" ));
			this.selectedPacchetto.setApprovato(true);
			admin.modificaPacchetto(selectedPacchetto);
		}
	}
	
}
